package timing.ukulele.third.service.msg;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import timing.ukulele.data.third.data.msg.MessageNoticeItemDTO;
import timing.ukulele.data.third.view.msg.MessageNoticeItemVO;
import timing.ukulele.third.convertor.msg.MessageNoticeItemConverter;
import timing.ukulele.third.exception.ThirdServiceException;
import timing.ukulele.third.mapper.msg.MessageNoticeItemMapper;
import timing.ukulele.third.persistent.msg.MessageNoticeItem;
import timing.ukulele.third.service.common.BaseOperatorService;
import java.util.List;

/**
 * @Description 概要描述
 * @Author zh
 * @Date 2025-10-13 16:38
 */
@Service
public class MessageNoticeItemService extends BaseOperatorService<MessageNoticeItemMapper, MessageNoticeItem> {

    private final MessageNoticeItemMappingFiledService filedService;

    public MessageNoticeItemService(MessageNoticeItemMappingFiledService filedService) {
        this.filedService = filedService;
    }

    public Boolean addMessageNoticeItem(MessageNoticeItemDTO dto) {
        validateWriteOperation(dto);
        MessageNoticeItem messageNoticeItem = MessageNoticeItemConverter.INSTANCE.d2p(dto);
        // 保存通知事项数据
        this.save(messageNoticeItem);
        // 保存字段数据
        filedService.handleByNoticeItem(messageNoticeItem, dto.getFiledKeyList());
        return Boolean.TRUE;
    }

    private void validateWriteOperation(MessageNoticeItemDTO dto) {
        if (this.lambdaQuery()
                .eq(MessageNoticeItem::getName, dto.getName())
                .notIn(dto.getId() != null, MessageNoticeItem::getId, dto.getId()).count() > 0) {
            throw new ThirdServiceException("名称已存在，请勿重复添加");
        }
    }

    public Boolean updateMessageNoticeItem(MessageNoticeItemDTO dto) {
        validateWriteOperation(dto);
        MessageNoticeItem messageNoticeItem = MessageNoticeItemConverter.INSTANCE.d2p(dto);
        this.updateById(messageNoticeItem);
        // 保存字段数据
        filedService.handleByNoticeItem(messageNoticeItem, dto.getFiledKeyList());
        return Boolean.TRUE;
    }

    public Boolean deleteMessageNoticeItem(Long id) {
        return this.lambdaUpdate().set(MessageNoticeItem::getDeleted, Boolean.TRUE)
                .eq(MessageNoticeItem::getId, id).update();
    }

    /**
     * 分页列表
     * @param dto
     * @return
     */
    public IPage<MessageNoticeItemVO> pageList(MessageNoticeItemDTO dto) {
        Page pageParam = new Page(dto.getCurrent(), dto.getPageSize());
        Page page = this.lambdaQuery()
                .in(CollectionUtil.isNotEmpty(dto.getServeIds()), MessageNoticeItem::getServeId, dto.getServeIds())
                .like(StrUtil.isNotBlank(dto.getName()), MessageNoticeItem::getName, dto.getName())
                .eq(MessageNoticeItem::getDeleted, Boolean.FALSE)
                .page(pageParam);
        List<MessageNoticeItemVO> list = MessageNoticeItemConverter.INSTANCE.p2vList(page.getRecords());
        list.forEach(item -> {
            item.setFiledKeyList(filedService.getFiledByNoticeItemId(item.getId()));
        });
        page.setRecords(list);
        return page;
    }

    /**
     * 根据服务ID获取列表
     * @param serverId
     * @return
     */
    public List<MessageNoticeItemVO> getByServerId(Long serverId) {
        List<MessageNoticeItem> list = this.lambdaQuery()
                .eq(MessageNoticeItem::getServeId, serverId)
                .eq(MessageNoticeItem::getDeleted, Boolean.FALSE)
                .list();
        List<MessageNoticeItemVO> voList = MessageNoticeItemConverter.INSTANCE.p2vList(list);
        voList.forEach(item -> {
            item.setFiledKeyList(filedService.getFiledByNoticeItemId(item.getId()));
        });
        return voList;
    }

}
